home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / linklist.d < prev    next >
Text File  |  1997-02-03  |  4KB  |  277 lines

  1.  
  2. /*
  3.  *
  4.  *    Copyright (c) 1993-1996 Algorithms Corporation
  5.  *    3020 Liberty Hills Drive
  6.  *    Franklin, TN  37067
  7.  *
  8.  *    ALL RIGHTS RESERVED.
  9.  *
  10.  *
  11.  *
  12.  */
  13.  
  14.  
  15.  
  16.  
  17. defclass  LinkList : Link  {
  18.     int    iNelm;
  19.     CRITICALSECTION    iCS;    /*  in support of native threads  */
  20. };
  21.  
  22. #define FIRST    gNext
  23. #define LAST    gPrevious
  24.  
  25. cmeth    gNew, <vNew> ()
  26. {
  27.     object    obj = gNew(super);
  28.     accessIVsOf(obj);
  29.     INITIALIZECRITICALSECTION(iCS);
  30.     gInitLink(obj, obj, obj, obj);
  31.     return obj;
  32. }
  33.  
  34. imeth    gIncNelm(int inc)
  35. {
  36.     if (0 > (iNelm += inc))
  37.         iNelm = 0;
  38.     return self;
  39. }
  40.  
  41. imeth    int    gSize()
  42. {
  43.     return iNelm;
  44. }
  45.  
  46. imeth    gFirst()
  47. {
  48.     object    r;
  49.     ENTERCRITICALSECTION(iCS);
  50.     r = FIRST(self);
  51.     LEAVECRITICALSECTION(iCS);
  52.     return r;
  53. }
  54.  
  55. imeth    gLast()
  56. {
  57.     object    r;
  58.     ENTERCRITICALSECTION(iCS);
  59.     r = LAST(self);
  60.     LEAVECRITICALSECTION(iCS);
  61.     return r;
  62. }
  63.  
  64. imeth    gAddFirst(lnk)
  65. {
  66.     ChkArg(lnk, 2);
  67.     ENTERCRITICALSECTION(iCS);
  68.     gAddAfter(self, lnk);
  69.     LEAVECRITICALSECTION(iCS);
  70.     return self;
  71. }
  72.  
  73. imeth    gAddLast(lnk)
  74. {
  75.     ChkArg(lnk, 2);
  76.     ENTERCRITICALSECTION(iCS);
  77.     gAddBefore(self, lnk);
  78.     LEAVECRITICALSECTION(iCS);
  79.     return self;
  80. }
  81.  
  82. imeth    gInsertObjAt(lnk, int idx)
  83. {
  84.     ChkArg(lnk, 2);
  85.     ENTERCRITICALSECTION(iCS);
  86.     if (!idx  ||  idx < -iNelm)
  87.         gAddAfter(self, lnk);      // beginning
  88.     else if (idx == -1  ||  idx >= iNelm)
  89.         gAddBefore(self, lnk);    // end
  90.     else if (idx > 0)
  91.         gAddAfter(gNth(self, idx), lnk);
  92.     else
  93.         gAddBefore(gNth(self, idx+1), lnk);
  94.     LEAVECRITICALSECTION(iCS);
  95.     return self;
  96. }
  97.  
  98. imeth    gDisposeFirst()
  99. {
  100.     ENTERCRITICALSECTION(iCS);
  101.     if (iNelm)
  102.         gDispose(FIRST(self));
  103.     LEAVECRITICALSECTION(iCS);
  104.     return self;
  105. }
  106.  
  107. imeth    gDeepDisposeFirst()
  108. {
  109.     ENTERCRITICALSECTION(iCS);
  110.     if (iNelm)
  111.         gDeepDispose(FIRST(self));
  112.     LEAVECRITICALSECTION(iCS);
  113.     return self;
  114. }
  115.  
  116. imeth    gRemoveFirst()
  117. {
  118.     object    r;
  119.     ENTERCRITICALSECTION(iCS);
  120.     r = iNelm ? gRemove(FIRST(self)) : NULLOBJ;
  121.     LEAVECRITICALSECTION(iCS);
  122.     return r;
  123. }
  124.  
  125. imeth    gDisposeLast()
  126. {
  127.     ENTERCRITICALSECTION(iCS);
  128.     if (iNelm)
  129.         gDispose(LAST(self));
  130.     LEAVECRITICALSECTION(iCS);
  131.     return self;
  132. }
  133.  
  134. imeth    gDeepDisposeLast()
  135. {
  136.     ENTERCRITICALSECTION(iCS);
  137.     if (iNelm)
  138.         gDeepDispose(LAST(self));
  139.     LEAVECRITICALSECTION(iCS);
  140.     return self;
  141. }
  142.  
  143. imeth    gRemoveLast()
  144. {
  145.     object    r;
  146.     ENTERCRITICALSECTION(iCS);
  147.     if (iNelm)
  148.         r = gRemove(LAST(self));
  149.     else
  150.         r = NULL;
  151.     LEAVECRITICALSECTION(iCS);
  152.     return r;
  153. }
  154.  
  155. imeth    gDisposeAllNodes()
  156. {
  157.     object    obj;
  158.  
  159.     ENTERCRITICALSECTION(iCS);
  160.     while (obj = FIRST(self))
  161.         gDispose(obj);
  162.     LEAVECRITICALSECTION(iCS);
  163.     return self;
  164. }
  165.  
  166. imeth    gDeepDisposeAllNodes()
  167. {
  168.     object    obj;
  169.  
  170.     ENTERCRITICALSECTION(iCS);
  171.     while (obj = FIRST(self))
  172.         gDeepDispose(obj);
  173.     LEAVECRITICALSECTION(iCS);
  174.     return self;
  175. }
  176.  
  177. imeth    object    gDispose()
  178. {
  179.     gDisposeAllNodes(self);
  180.     DELETECRITICALSECTION(iCS);
  181.     return gDispose(super);
  182. }
  183.  
  184. imeth    object    gDeepDispose()
  185. {
  186.     gDeepDisposeAllNodes(self);
  187.     DELETECRITICALSECTION(iCS);
  188.     return gDeepDispose(super);
  189. }
  190.  
  191. imeth    gSequence()
  192. {
  193.     return gNewWithObj(LinkSequence, FIRST(self));
  194. }
  195.  
  196. imeth    gCopy()
  197. {
  198.     object    nobj;
  199.     ivType    *iv2;
  200.     object    lnk;
  201.  
  202.     ENTERCRITICALSECTION(iCS);
  203.     nobj = gCopy(super);
  204.     iv2 = ivPtr(nobj);
  205.     iv2->iNelm = 0;
  206.     gInitLink(nobj, nobj, nobj, nobj);
  207.     for (lnk=FIRST(self) ; lnk ; lnk = gNext(lnk))
  208.         gAddBefore(nobj, gCopy(lnk));
  209.     LEAVECRITICALSECTION(iCS);
  210.     return nobj;
  211. }
  212.  
  213. imeth    gDeepCopy()
  214. {
  215.     object    nobj;
  216.     ivType    *iv2;
  217.     object    lnk;
  218.  
  219.     ENTERCRITICALSECTION(iCS);
  220.     nobj = gDeepCopy(super);
  221.     iv2 = ivPtr(nobj);
  222.     iv2->iNelm = 0;
  223.     gInitLink(nobj, nobj, nobj, nobj);
  224.     for (lnk=FIRST(self) ; lnk ; lnk = gNext(lnk))
  225.         gAddBefore(nobj, gDeepCopy(lnk));
  226.     LEAVECRITICALSECTION(iCS);
  227.     return nobj;
  228. }
  229.  
  230. imeth    gStringRep()
  231. {
  232.     object    lnk, s, t;
  233.  
  234.     ENTERCRITICALSECTION(iCS);
  235.     s = gStringRepValue(super);
  236.     gAppend(s, (object) "  (");
  237.     for (lnk = FIRST(self) ; lnk ; )  {
  238.         t = gStringRepValue(lnk);
  239.         if (lnk = gNext(lnk))
  240.             vBuild(s, NULL, t, ", ", NULL);
  241.         else
  242.             gAppend(s, t);
  243.         gDispose(t);
  244.     }
  245.     gAppend(s, (object) ")\n");
  246.     LEAVECRITICALSECTION(iCS);
  247.     return s;
  248. }
  249.  
  250. imeth    gEnterCriticalSection()
  251. {
  252.     ENTERCRITICALSECTION(iCS);
  253.     return self;
  254. }
  255.  
  256. imeth    gLeaveCriticalSection()
  257. {
  258.     LEAVECRITICALSECTION(iCS);
  259.     return self;
  260. }
  261.  
  262.  
  263.  
  264.  
  265. /*
  266.  *
  267.  *    Copyright (c) 1993-1996 Algorithms Corporation
  268.  *    3020 Liberty Hills Drive
  269.  *    Franklin, TN  37067
  270.  *
  271.  *    ALL RIGHTS RESERVED.
  272.  *
  273.  *
  274.  *
  275.  */
  276.  
  277.